/*
 * main.c
 */
//#define TARGET_IS_BLIZZARD_RA1
#include "math.h"

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>

#include "gdefines.h"
#include <inc/lm4f120h5qr.h>
#include <driverlib/rom.h>
#include <inc/hw_memmap.h>
#include <inc/hw_types.h>
#include <inc/hw_memmap.h>
#include <inc/hw_gpio.h>
#include <inc/hw_ints.h>
#include <inc/hw_memmap.h>
#include <inc/hw_types.h>
#include <driverlib/debug.h>
#include <driverlib/fpu.h>
#include <driverlib/gpio.h>
#include <driverlib/interrupt.h>
#include <driverlib/pin_map.h>
#include <driverlib/sysctl.h>
#include <driverlib/timer.h>

#include "drivers/onewire.h"
#include "drivers/ds18b20.h"

extern unsigned long ulTest;
extern uint8_t owBusy;
extern uint32_t uiDeviceSampleTime;
owDevice_t dispositivos[10];

int main(void) {
	uint32_t ciclos = 0;
	uint8_t scratch[9];
	int16_t temperatura;
	owDevice_t dispositivos[10];
	uint8_t numeroSensores;
	uint8_t i;
	error_t retVal;
	uint8_t cfg_ds1820[] = {0,0,0x7f};
	//
	// Set the clocking to run directly from the crystal.
	//
	ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ );

	//
	// Enable the GPIO port
	//
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

	//
	// Pin del OW como open drain
	//
	ROM_GPIOPinTypeGPIOOutputOD(GPIO_PORTB_BASE, GPIO_PIN_0);
	ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_1);
	//
	// Enable the peripherals used by this example.
	//
	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

	//
	// Enable processor interrupts.
	//
	ROM_IntMasterEnable();

	//
	// Configure the two 32-bit periodic timers.
	//
	ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_A_ONE_SHOT);
	ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, 8000000);
	//
	// Setup the interrupts for the timer timeouts.
	//
	ROM_IntEnable(INT_TIMER0A);

	ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

	//
	// Enable the timers.
	//
	//ROM_TimerEnable(TIMER0_BASE, TIMER_A);

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTStdioInit(0);

    UARTprintf("Welcome to the Stellaris LM4F120 LaunchPad!\n");
    UARTprintf("Type 'help' for a list of commands\n");
    UARTprintf("> ");

	//
	owInit();
	if (ret_Ok != owSearchRom(dispositivos, &numeroSensores))
	{
		return 1;
	}
	UARTprintf("Dispositivos encontrados: %d\n",numeroSensores);
	for (i=0;i<numeroSensores;i++)
	{
		ds18b20_setCfg(&(dispositivos[i]), cfg_ds1820);
	}

	ciclos = ROM_SysCtlClockGet();
	ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ciclos*1/100);
	ROM_GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0);
	while (1) {
		if((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0)&GPIO_PIN_0)==0)
		{
			GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
		}
		else{
			GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, !GPIO_PIN_2);
		}
		for (i=0;i<numeroSensores;i++)
		{
			ds18b20_getTemp(&(dispositivos[i]), &temperatura);
			UARTprintf("s%d: %d.%04d\n",i,temperatura>>4,temperatura%32);
		}
	}
	return 0;
}
